/*function的另类调用 start*/
function foo(a, b, c) {
	console.info({a:a, b:b, c:c});
}
var bar = {};
//foo(1,2,3);
//foo.apply(bar, [1, 2, 3]); // 数组将会被扩展，如下所示
//foo.call(bar, 1, 2, 3); // 传递到foo的参数是：a = 1, b = 2, c = 3
/*function的另类调用 end*/




/*hasOwnProperty start*/
// 修改Object.prototype
Object.prototype.bar = 1; 
var foo = {goo: undefined};

//console.info(foo.bar); // 1
//console.info('bar' in foo); // true
//
//console.info(foo.hasOwnProperty('bar')); // false
//console.info(foo.hasOwnProperty('goo')); // true






var foo = {
    hasOwnProperty: function() {
        return false;
    },
    bar: 'Here be dragons'
};
//console.info(foo.hasOwnProperty('bar')); // 总是返回 false
// 使用其它对象的 hasOwnProperty，并将其上下为设置为foo
//console.info({}.hasOwnProperty.call(foo, 'bar')); // true
/*hasOwnProperty end*/


/*匿名闭包 高级用法 start*/
var blogModule = (function (my) {
	my = my || {};
    my.AddPhoto = function () {
    	console.info("调用了AddPhoto");
    };
    return my;
} (blogModule));
//blogModule.AddPhoto();
/*匿名闭包 高级用法 end*/




/*匿名闭包 引用全局变量 start*/
var blogModule = (function () {
    var my = {}, privateName = "博客园";
    function privateAddTopic(data) {
    	console.info("添加图片："+data);
    }
    my.Name = privateName;
    my.AddTopic = function (data) {
        privateAddTopic(data);
    };
    return my;
} ());
//console.info(blogModule.Name);
//blogModule.AddTopic("图片");
/*匿名闭包 引用全局变量 end*/


/*古老的module模式 start*/
var Calculator = function (eq) {
    //这里可以声明私有成员
    var eqCtl = document.getElementById(eq);
    return {
        // 暴露公开的成员
        add: function (x, y) {
            var val = x + y;
            console.info(val);
        }
    };
};
//var calculator = new Calculator('channelTree');//初始化方法
//calculator.add(1, 2);//调用方法
/*古老的module模式 end*/


/*JS中的！=、== 、！==、===的用法和区别 start*/
var num = 1;
var str = '1';
var test = 1;
var run = function() {
	console.info(test === num);//true 相同类型，相同值
	console.info(num == str);//true 把str转换为数字，检查其是否相等
	console.info(num === str);//false 类型不同
};
//run();
/*JS中的！=、== 、！==、===的用法和区别 end*/





/*js不限定传参 start*/
var run = function(param1, param2, param3) {
	"use strict";//使用传入的值，不重新赋值
	arguments[0] = "OK";
	console.info({param1:param1,param2:param2,param3:param3});
	var argumentMap = {};
	for(var i=0; i<arguments.length; i++) {
		argumentMap["param"+i] = arguments[i];
	}
	console.info(argumentMap);
};
//run("Li", "Qi", "Ran");
/*js不限定传参 end*/